# -*- coding:utf-8 -*-

"""
    得到 预测 的 pairwise

    理由 图的 处理， 得到 所有的 预测 pairwise

    图中 未出现的 点， 作为 单独 一个作者的点

    得到 事实上的 pairwise

    有 事实和 预测结果 进行  f1 评价， 到此为止。

"""
from nd_utils.trans_clusteridxlist_paperidx_pairset import get_paperidx_pairset_list

class Model_metric():
    def __init__(self, true_paperidx_cluster_list, predict_paperidx_cluster_list):
        self.true_pairwise_set_list = get_paperidx_pairset_list(true_paperidx_cluster_list)
        self.predict_pairwise_set_list = get_paperidx_pairset_list(predict_paperidx_cluster_list)

        self.true_paperidx_cluster_list = true_paperidx_cluster_list
        self.predict_paperidx_cluster_list = predict_paperidx_cluster_list
        self.tp_plus_fn = len(self.true_pairwise_set_list)
        self.tp_plus_fp = len(self.predict_pairwise_set_list)
        self.tp = self._get_tp()

        self.pairwise_f1 = self.get_pairwise_f1()
        self.pairwise_precision = self.get_pairwise_precision()
        self.pairwise_recall = self.get_pairwise_recall()
        pass

    def is_set_equal(self, pairset1, pairset2):
        if pairset1.issubset(pairset2) and pairset2.issubset(pairset1):
            return True
        else:
            return False

    # def _get_tp(self):
    #     tp = 0
    #     for set1 in self.true_pairwise_set_list:
    #         for set2 in self.predict_pairwise_set_list:
    #             if self.is_set_equal(set1, set2):
    #                 tp += 1
    #                 break
    #     return tp

    def _get_tp(self):
        sum = 0
        for true_paperidx_cluster in self.true_paperidx_cluster_list:
            if len( true_paperidx_cluster) == 1:
                continue
            for predict_paperidx_cluster in self.predict_paperidx_cluster_list:
                if len(predict_paperidx_cluster) == 1:
                    continue
                co_paperidx_num = len( set( true_paperidx_cluster ).intersection(set( predict_paperidx_cluster )))
                sum  +=  co_paperidx_num * (co_paperidx_num - 1) *1.0 / 2
        return sum
    # p : 3p
    def get_pairwise_precision(self):
        return float(self.tp) / self.tp_plus_fp

    # p : 2p1n
    def get_pairwise_recall(self):
        return float(self.tp) / self.tp_plus_fn

    def get_pairwise_f1(self):
        precision = self.get_pairwise_precision()
        recall = self.get_pairwise_recall()
        return float(2 * precision * recall) / (precision + recall)
    #  predict_paperid_pairset_list
    #  paperid_pairset_list

    # 输出f1


    """
        明天：Model_metric
        f1 评价
    """